package jwj.swing.component;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class J22_JTable extends JFrame {

	public J22_JTable() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(250, 250, 450, 350);
		getContentPane().setLayout(new BorderLayout());
		setTitle("JTable 맛배기");

		// 스크롤 영역 생성 (반드시 필요)
		JScrollPane scroll = new JScrollPane();
		scroll.setPreferredSize(new Dimension(400, 300));
		getContentPane().add(scroll);

		// JTable에 표시할 데이터를 정의하기 위해 DefaultTableModel 클래스 생성
		// DefaultTableModel model = new DefaultTableModel();
		// 수정불가 TableModel 작성(내부클래스)
		DefaultTableModel model = new DefaultTableModel() {
			@Override
			public boolean isCellEditable(int row, int column) {
				return false;
			} // 열 수정 불가
		};

		// 제목 작성
		String title[] = { "제목1", "제목2", "제목3", "제목4", "제목5" };
		model.setColumnIdentifiers(title);

		// 본문 작성
		// model.addRow(new String[] {"11", "22", "33", "44", "55"});
		for (int i = 1; i <= 50; ++i) {
			model.addRow(new String[] { i + 1 + "", i + 2 + "", i + 3 + "",
					i + 4 + "", i + 5 + "" });
		}

		// JTable 생성하고 tablemodel에 추가
		JTable table = new JTable();
		table.setCellSelectionEnabled(true);
		table.setColumnSelectionAllowed(true);
		table.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		table.setModel(model);

		TableCellRenderer renderer = new MyTableCellRenderer();
		try {
			table.setDefaultRenderer(Class.forName("java.lang.Object"),
					renderer);
		} catch (ClassNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		// 테이블의 셀 내용을 가운데로 정렬
		// 테이블 셀의 세부속성을 상세히 제어하려면 DefaultTableRender 클래스 사용
		// 정렬, 크기조절, 그림삽입 등등의 고급효과는
		// DefaultTableRenderer 없이는 처리 불가
		DefaultTableCellRenderer cell = new DefaultTableCellRenderer();
		cell.setHorizontalAlignment(JLabel.CENTER); // 가운데 정렬
		/*
		 * table.getColumnModel().getColumn(0).setCellRenderer(cell);
		 * table.getColumnModel().getColumn(2).setCellRenderer(cell);
		 * table.getColumnModel().getColumn(3).setCellRenderer(cell);
		 * table.getColumnModel().getColumn(4).setCellRenderer(cell);
		 */
		table.getColumnModel().getColumn(0).setCellRenderer(cell);
		// cell.setBackground(new Color(150, 150, 150));

		// JTable에 마우스 더블클릭 이벤트 추가
		table.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				if (e.getClickCount() == 2) { // 더블클릭하면
					JTable table = (JTable) e.getSource();
					int row = table.getSelectedRow(); // 선택행
					int col = table.getSelectedColumn(); // 선택열
					String val = (String) table.getValueAt(row, col); // 값
					String msg = row + "\n" + col + "\n" + val;
					JOptionPane.showMessageDialog(null, msg);
				}
			}
		});

		// 스크롤페인의 뷰영역에 JTable 추가
		scroll.setViewportView(table);
		
		JLabel lblNewLabel = new JLabel("New label");
		scroll.setColumnHeaderView(lblNewLabel);

		// 화면에 표시
		setVisible(true);
	}

	public static void main(String arg[]) {
		EventQueue.invokeLater(new Runnable() {

			@Override
			public void run() {
				new J22_JTable();
			}
		});

	}

	public class MyTableCellRenderer extends DefaultTableCellRenderer {
		@Override
		public Component getTableCellRendererComponent(JTable table,
				Object value, boolean isSelected, boolean hasFocus, int row,
				int col) {
			Component cell = super.getTableCellRendererComponent(table, value,
					isSelected, hasFocus, row, col);

			if ("2".equals(table.getValueAt(row, col))) {
				cell.setBackground(Color.orange);
				System.out.println(row + "/ " + col);
			} else {
				cell.setBackground(Color.GRAY);
			}

			return cell;
		}
	}
}
